package com.treeroot.treenet.common.tools;

import java.util.Collection;
import java.util.Map;
import java.util.Optional;

/**
 * desc:Inter类型0也是空
 *
 * @author xugenyin
 * @date 2021/8/25 15:00
 */
public class CheckTools {

    private static final String IS_NULL = "null";

    /**
     * 判断对象是否为Null或空
     *
     * @param obj 需要判断的对象
     * @return True:空 False：非空
     */
    public static boolean isNullOrEmpty(Object obj) {
        if (null == obj) {
            return true;
        }
        if (obj instanceof String) {

            if (((String) obj).isEmpty() || IS_NULL.equals(obj)) {
                return true;
            }
        }
        if (obj instanceof String[]) {
            if (((String[]) obj).length == 0) {
                return true;
            }
        }
        /*
         * 判断一个Integer类型的值不是为0
         */
        if (obj instanceof Integer) {
            if ((Integer) obj == 0) {
                return true;
            }
        }
        if (obj instanceof Collection) {
            return ((Collection<?>) obj).isEmpty();
        }
        if (obj instanceof Map) {
            return ((Map<?, ?>) obj).isEmpty();
        }
        return false;
    }

    /**
     * 判断对象是否不为Null或非空
     *
     * @param obj 需要判断的对象
     * @return True:非空 False：空
     */
    public static boolean isNotNullOrEmpty(Object obj) {
        return !isNullOrEmpty(obj);
    }

    /**
     * 进行空检查，然后返回
     *
     * @param obj 对象
     * @return boolean
     */
    public static boolean doNullCheckThenReturn(Object obj) {
        if (isNullOrEmpty(obj)) {
            // 获取类名和方法名
            StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
            String className = stackTraceElements[2].getClassName();
            String methodName = stackTraceElements[2].getMethodName();
            int lineNumber = stackTraceElements[2].getLineNumber();
            System.out.println(className + "." + methodName + "()方法的入参为空+行号：" + lineNumber);
            return true;
        }
        return false;
    }

    /**
     * Optional 风格：自动判Null和空并判返回 Optional
     */
    public static <T> Optional<T> ofNotEmpty(T obj) {
        return Optional.ofNullable(obj)
                .filter(o -> !isNullOrEmpty(o));
    }

}
